package com.shujia

import scala.beans.BeanProperty

object Demo06Func03 {
  // 如果以函数作为返回值，则返回值的类型无法自动推断，需要手动指定
  def func01(str: String): Int => Int = {
    // 函数定义在另一个函数内部
    def func01_1(int: Int): Int = {
      str.toInt + int + 100
    }

    func01_1
  }

  // 定义也是可以进行简化的
  def func02(str: String)(int: Int): Int = {
    // 函数定义在另一个函数内部
    str.toInt + int + 100
  }

  // 函数柯里化：将有N个参数的函数，变成N个只有一个参数的函数
  def func03(i1: Int, i2: Int, i3: Int, i4: Int = 4, i5: Int = 5): Int = {
    i1 + i2 + i3 + i4 + i5
  }

  def func03_KL(i1: Int)(i2: Int)(i3: Int)(i4: Int)(i5: Int): Int = {
    i1 + i2 + i3 + i4 + i5
  }

  // 偏应用函数：将有N个参数的函数，变成N-M个参数的函数，其中的M是固定的参数个数


  // 以函数作为返回值
  def main(args: Array[String]): Unit = {
    val intToInt: Int => Int = func01("100")
    val res: Int = intToInt(100)
    println(res)

    // 简化调用 以函数作为返回值的函数 可以调用两次
    println(func01("100")(100))

    println(func02("200")(200))

    val intToIntToInt: Int => Int => Int = func03_KL(1)(2)(3)
    intToIntToInt(4)(5)
    intToIntToInt(44)(55)

    func03(1, 2, 3)
  }

}